import core from '@/core/'

// 通过url获取文件名以及后缀
const fileInfoFromUrl = (url) => {
	if (url) {
		const num = url.lastIndexOf('/') + 1
		const arr = url.substring(num).split('.')
		if (arr.length === 1) {
			arr.push('')
		}
		return arr
	}
	return ['', '']
}

/**
 * 获取不含后缀的文件名
 */
const getFileName = (file, path) => {
	var fileName
	if (file.path) {
		fileName = fileInfoFromUrl(file.path)[0]
	}
	if (path && path.indexOf('.') > -1) {
		fileName = fileInfoFromUrl(path)[0]
	}
	if (file.name) {
		if (file.name.indexOf('.') > -1) {
			fileName = file.name.split('.')[0]
		}
	}
	return fileName
}

/**
 * 获取文件名后缀
 * 一定不能含-，否则和cloudPath的规则冲突
 * 另外mpeg有可能是音频也有可能是视频，所以不用mpeg
 */
const getExtension = (file, path) => {
	var extName
	if (file.name) {
		if (file.name.indexOf('.') > -1) {
			extName = file.name.split('.').pop()
		}
	}
	if (file.path && fileInfoFromUrl(file.path)[1]) {
		extName = fileInfoFromUrl(file.path)[1]
	}
	if (path && path.indexOf('.') > -1) {
		extName = fileInfoFromUrl(path)[1]
	}
	if (file.type) { 
		/**
		 * 这个是最准确的后缀
		 * 但是比如excel文件得到的后缀名是：vnd.ms-excel。暂时的方案是只取最后得到excel
		 */
		var name
		if (file.type.indexOf('/') > -1) {
			name = file.type.split('/').pop()
			if (extName.indexOf('-') > -1) {
				name = extName.split('-').pop()
			}
		}
		if (name && name !== 'mpeg') {
			extName = name
		}
	}
	return extName
}

/**
 * 通过SparkMD5获取文件的md5
 */
const md5BySpark = (res) => {
	// 将Base64字符串转换为二进制字符串
	res = atob(res.split(',')[1])
	const SparkMD5 = require('spark-md5')
	const md5 = SparkMD5.hashBinary(res)
	console.log('文件的md5：' + md5)
	return md5
}

/**
 * 获取文件的base64数据
 * fileType：文件类型。微信小程序需要
 */
const getBase64 = (file, fileType = 'image/jpeg') => {
	return new Promise((resolve, reject) => {
		// #ifdef MP-WEIXIN
		const FileSystemManager = uni.getFileSystemManager()
		FileSystemManager.readFile({
			filePath: file.path,
			encoding: 'base64',
			success: res => {
				resolve(`data:${fileType};base64,` + res.data)
			},
			fail: reject
		})
		// 微信小程序可直接获取文件的md5值。其值与md5BySpark相同
		FileSystemManager.getFileInfo({
			filePath: file.path,
			digestAlgorithm: 'md5',
			// digestAlgorithm: 'sha1',
			// digestAlgorithm: 'sha256',
			success: (res) => {
				console.log(res)
			}
		})
		// #endif
		// #ifdef APP-PLUS
		plus.io.resolveLocalFileSystemURL(file.path, (entry) => {
			entry.file(file => {
				const reader = new plus.io.FileReader()
				reader.onloadend = e => {
					resolve(e.target.result)
				}
				reader.onerror = reject
				reader.readAsDataURL(file)
			}, function(e) {
				console.log("读取文件失败：" + e.message)
			})
		}, e => {
			reject(e)
		})
		// #endif
		// #ifdef H5
		const reader = new FileReader()
		reader.onloadend = e => {
			resolve(e.target.result)
		}
		reader.readAsDataURL(file)
		// #endif
		// #ifndef APP || MP-WEIXIN || H5
		resolve('')
		// #endif
	})
}

/**
 * 获取文件的md5值
 */
const getMD5 = (file) => {
	return new Promise((resolve, reject) => {
		getBase64(file).then(res => {
			resolve(md5BySpark(res))
		}).catch(reject)
	})
}

/**
 * 处理选择后的文件
 * 返回结果都是数组形式
 */
const handleSelectedFiles = (res, ceilingSize) => {
	/**
	 * h5上图片和其它文件都可多选。选择的结果res：
	 *  errMsg: "chooseImage:ok"
		tempFilePaths: Array(1)
		tempFiles: [File]
	 */
	/**
	 * H5上视频只能单选，选择的结果res:
		duration: 19.583333
		errMsg: "chooseVideo:ok"
		height: 368
		name: "示例视频3.mp4"
		size: 1485672
		tempFile: File {name: '示例视频3.mp4', lastModified: 1653966008780, lastModifiedDate: Tue May 31 2022 11:00:08 GMT+0800 (中国标准时间), webkitRelativePath: '', size: 1485672, …}
		width: 654
		tempFilePath: "blob:http://192.168.2.86:8080/3071132e-f5bf-4f30-a8e2-acd44514a714"
	 */
	const {maxSize} = ceilingSize
	const {tempFiles, tempFilePaths, tempFile, tempFilePath} = res
	const tFiles = tempFiles || [tempFile]
	const tPaths = tempFilePaths || [tempFilePath]
	const paths = [], files = [], fileTypes = [], md5s = [], failArr = []
	
	tFiles.map((item, index) => {
		var file = item
		if (item.file) {
			// 一般不会出现这种现象，用uni-picker-file会有
			file = item.file
		}
		if (file.size < parseFloat(maxSize) * 1024 * 1024) {
			paths.push(tPaths[index])
			files.push(file)
			if (item.fileType) {
				fileTypes.push(item.fileType)
			} else {
				fileTypes.push(item.type)
			}
		} else {
			failArr.push(`第${index + 1}个`)
		}
	})
	return new Promise((resolve, reject) => {
		if (failArr.length > 0) {
			// 有超限文件的提醒
			core.showToast(`${failArr.length < tFiles.length ? failArr.join('、') : ''}文件超限，已自动取消`)
		}
		if (files.length > 0) {
			const cycle = (index) => {
				if (index < files.length) {
					getMD5(files[index]).then(md5 => {
						md5s.push(md5)
						cycle(index + 1)
					})
				} else {
					res = {
						...res,
						tempFiles: files,
						tempFilePaths: paths,
						fileTypes, md5s, 
						count: files.length,
					}
					/**
					 * 统一不要tempFile和tempFilePath
					 */
					delete res.tempFile
					delete res.tempFilePath
					// 回到组件处理最后的结果
					resolve(res)
				}
			}
			cycle(0)
		} else {
			core.showToast('没有满足的文件，请重新选择')
			reject('没有满足的文件，请重新选择')
		}
	})
}

/**
 * 处理宽高的提醒
 */
const handleSizeModal = (info, fileData, callback) => {
	const {width, height, duration, top = 0.1, bottom = 0.1} = info
	if (duration && fileData.duration && fileData.duration > duration) {
		return core.showModal({
			content: `时长超过上限！上限：${duration}秒`,
			confirmText: '我知道了',
			showCancel: false,
			success(res) {
				if (res.confirm) {
					callback && callback(false)
				}
			}
		})
	}
	if (width && height) {
		// 限定宽高的情况。宽高比例在超过上下10%就提醒
		const scale = core.synctool.number.round(width / height)
		var res = fileData.scale - scale
		if ((res > 0 && res > top) || (res < 0 && (res * -1) > bottom)) {
			// 超过则提醒
			core.showModal({
				content: `内容宽高比值（${fileData.scale}）超过了预设定比值（${scale}）的${(res > 0 ? top : bottom) * 100}%。请知悉！`,
				confirmText: '我知道了',
				cancelText: '取消上传',
				showCancel: info.continue,
				success(res) {
					if (res.confirm && info.continue) {
						callback && callback(true)
					} else {
						callback && callback(false)
					}
				}
			})
		} else {
			callback && callback(true)
		}
	} else {
		if (width) {
			var res = (fileData.width - width) / width
			if ((res > 0 && res > top) || (res < 0 && (res * -1) > bottom)) {
				// 建议宽度 超过则提醒
				core.showModal({
					content: `内容宽度（${fileData.width}）超过了预设定宽度（${width}）的${(res > 0 ? top : bottom) * 100}%。请知悉！`,
					confirmText: '我知道了',
					cancelText: '取消上传',
					showCancel: info.continue,
					success(res) {
						if (res.confirm && info.continue) {
							callback && callback(true)
						} else {
							callback && callback(false)
						}
					}
				})
			} else {
				callback && callback(true)
			}
		} else if (height) {
			var res = (fileData.height - height) / height
			if ((res > 0 && res > top) || (res < 0 && (res * -1) > bottom)) {
				// 建议高度 超过10%则提醒
				core.showModal({
					content: `内容高度（${fileData.height}）超过了预设定高度（${height}）的${(res > 0 ? top : bottom) * 100}%。请知悉！`,
					confirmText: '我知道了',
					cancelText: '取消上传',
					showCancel: info.continue,
					success(res) {
						if (res.confirm && info.continue) {
							callback && callback(true)
						} else {
							callback && callback(false)
						}
					}
				})
			} else {
				callback && callback(true)
			}
		} else {
			callback && callback(true)
		}
	}
}

module.exports = {
	getFileName,
	getExtension,
	getBase64,
	handleSelectedFiles,
	handleSizeModal
}